package service

import (
	"fmt"
	"lgb24kcs.com/im/utils"
	"log"
	"time"

	"github.com/gorilla/websocket"
	"lgb24kcs.com/im/internal/dao"
	"lgb24kcs.com/im/internal/model"
)

// HandleMessage 处理消息类型逻辑
func HandleMessage(msg model.Message) {
	msg.Timestamp = time.Now().Unix()
	switch msg.Type {
	case "PrivateChat":
		// 私聊消息
		handlePrivateMessage(msg)
	case "GroupChat":
		// 群聊消息
		handleGroupMessage(msg)
	default:
		break
	}
}

// handlePrivateMessage 私聊逻辑
func handlePrivateMessage(msg model.Message) {
	err := dao.SavePrivateMessage(msg)
	if err != nil {
		log.Println("存储私聊信息失败", err.Error())
		return
	}

	// 尝试在线推送
	if conn := getUserConnection(msg.To); conn != nil {
		// 用户在线，直接推送消息
		conn.WriteJSON(msg)
	} else {
		log.Println("用户", msg.To, "不在线，消息存入mq")
	}

}

// handleGroupMessage 群聊逻辑
func handleGroupMessage(msg model.Message) {
	groups, err := dao.GetGroupMembers(msg.To)
	if err != nil {
		log.Println("获取群成员失败")
		return
	}
	fmt.Printf("groups: %s ，在线人数：%d\n", groups, len(groups))
	if len(groups) == 0 {
		// 存储用户
	}
	// 存储群聊信息
	err = dao.SaveGroupMessage(msg)
	if err != nil {
		log.Println("存储群聊信息失败", err.Error())
		return
	}
	// 遍历所有群组成员，并广播消息
	for _, group := range groups {
		if conn := getUserConnection(group); conn != nil {
			conn.WriteJSON(msg)
		} else {
			log.Println("用户", group, "不在线，消息存入mq")
		}
	}
}

// getUserConnection 获取websocket 连接
func getUserConnection(userId string) *websocket.Conn {
	// 这里应该从全局的连接池中获取用户对应的websocket 连接
	log.Println("接收消息的用户是: ", userId)
	UserConn := utils.GetClient(userId)
	return UserConn

}
